package com.vecspace.dayu.code.service;

import java.io.File;
import java.util.Date;
import java.util.List;

import org.springframework.stereotype.Service;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

import com.vecspace.dayu.code.dao.ProjectDao;
import com.vecspace.dayu.code.pojo.Project;
import com.vecspace.exception.HException;
import com.vecspace.utils.Assert;
import com.vecspace.utils.NumberUtil;
import com.vecspace.utils.log.HLogger;

/**功能描述 DAYU-项目定义的增、删、改查等业务操作的service类
 * @author wanghua
 * @reviewer
 */
@Service("dayu_projectService")
public class ProjectService {
	/** 根据ID查询 DAYU-项目定义 
	 * @param id   主键值
	 * @return Project
	 * @throws Exception
	 * @author wanghua
	 */
	public Project getProject(Long id) throws Exception{
		return projectDao.getProject(id);
	}
	
	/**获取目录下的系统
	 * 
	 * @param catalogId
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public List<Project> getProjects(Long catalogId) throws Exception {
		return projectDao.getProjects(catalogId);
	}
	

	public List<Project> getAllProjects() throws Exception {
		return projectDao.getAllProjects();
	}

	/**获取目录下的系统个数
	 * 
	 * @param catalogId
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public int getProjectsCount(Long catalogId) throws Exception {
		return projectDao.getProjectsCount(catalogId);
	}
	
	/***将页面上传入的对象转为持久化对象（如果页面对象是一个新对象，则insert;否则从数据库库查询出已有的对象item2，将传入的值赋值给item2，然后将item2 update到数据库）
	 * 根据页面上放置的属性个数，需要对下面的属性设置进行调整。
	 * 对于无法在页面上进行修改的属性，不要进行设值。
	 * @param item item是由页面传递过来的对象，item中的属性并不完整，对于在页面上没有展示的属性，item中一律会是空值，而数据库中这些属性可以是有值的
	 * @return Project
	 * @throws Exception
	 * @author wanghua
	 */
	public Project saveViewProject(Project item, String loginId) throws Exception {
		if (item == null){
			return null;
		}
		/*** 下面开始对item对象的页面传值进行校验，如必填项，格式等 ***/
		//Assert.throwz(StringUtils.isNotBlank() , "条件不满足时抛出异常");
		/*** 结束校验 ***/
		String oldPdmPath = "";
		Project item2;
		if (NumberUtil.isNotNullZero(item.getId())) {
			/**从数据库中取出原始对象，将从页面传过来的新值赋值给原始对象，并将原始对象再保存到数据库中 **/
			item2 = getProject(item.getId());
			if (item2 != null) {
				/*** 将页面上的新值逐一赋值，不在页面上的属性不要进行赋值 ***/
				item2.setName(item.getName());//更新功能名称				
				item2.setDbType(item.getDbType());//更新数据库类型
				item2.setDbSchema(item.getDbSchema());//更新数据库名
				item2.setDbUser(item.getDbUser());//更新数据库用户名
				item2.setDbPasswd(item.getDbPasswd());//更新数据库密码
				//item2.setPdmFile(item.getPdmFilePath());//更新PDM文件
				if(!StringUtils.equals(item2.getPdmFilePath(), item.getPdmFilePath())) {
					oldPdmPath = item2.getPdmFilePath();
					item2.setPdmFilePath(item.getPdmFilePath());
					item2.setPdmFileName(item.getPdmFileName());
					item2.setPdmFileUploadTime(new Date());
					item2.setPdmFileUploader(loginId);
				}
				item2.setOrdnum(item.getOrdnum());//更新顺序号
				/**end**/
			} else {
				item2 = item;
				if(StringUtils.isNotEmpty(item2.getPdmFilePath())) {
					item2.setPdmFileUploadTime(new Date());
					item2.setPdmFileUploader(loginId);
				}
			}
		}else{ //item是新增加的对象
			boolean superAdmin =  projectUserService.isSuperAdmin(loginId);
			if(!superAdmin) {
				throw new HException("您不是超级管理员，不能添加项目");
			}
			item2 = item;
		}
		saveProject(item2, loginId);
		if(oldPdmPath != null && oldPdmPath.length() > 0) { //删除无用的pdm文件
			String absPdmFilePath = this.getAbsPdmFilePath(oldPdmPath);
			File pdmFile = new File(absPdmFilePath);
			if(pdmFile.exists()) {
				try {
					pdmFile.delete();
				}catch(Exception ex) {
					HLogger.DEFAULT().error(ex);
				}
			}
		}
		return item2;
	}
	
	/** 插入或修改 DAYU-项目定义 ，item中的所有属性都会更新到数据库中（包括属性值为null的，也会将null更新到数据库，覆盖之前的值）。
	 * @param item	要保存的对象
	 * @return void
	 * @throws Exception
	 * @author wanghua
	 */
	public void saveProject(Project item, String loginId) throws Exception{
		if (item == null){
			return;
		}
		/*** 下面开始对item对象进行校验，如逻辑关系等 ***/
		
		Assert.throwz(item.getCatalogId() != null && item.getCatalogId() >0 , "项目所属目录catalogId不能为空");
		
		/*** 结束校验 ***/
		Date date = new Date();
		if (NumberUtil.isNullOrZero(item.getId())) {
			item.setId(null);
			item.setCreateTime(date);
			item.setCreateUser(loginId);//更新记录创建人ID

		} else {

		}
		projectDao.saveProject(item);
	}
	
	/** 根据ID删除 DAYU-项目定义 
	 * @param id	主键值
	 * @return void
	 * @throws Exception
	 * @author wanghua
	 */
	public void deleteProject(Long id) throws Exception{
		int funcCount = funcService.getRootFuncsCount(id);
		if(funcCount > 0) {
			throw new HException("ERR-301", "此项目下存在功能，不能删除！");
		}
		projectDao.deleteProject(id);
	}
	
	public String getAbsPdmFilePath(String relatePath) {
		String pdmFileDir = this.getPdmFileDir();		
		String fileFullName = pdmFileDir + File.separator + relatePath;
		return fileFullName;
	}
	public String getPdmFileDir() {
		String pdmFilePath = uploadPath + File.separator + "pdm";
		
		return pdmFilePath;
	}
	
	/** property **/
	@Value("${file.upload.basepath}")
	private String uploadPath;
	
	@Autowired
	private ProjectDao projectDao;
	@Autowired
	private FuncService funcService;
	@Autowired
	ProjectUserService projectUserService;
}
